/**
 * Created by XianTao on 16-11-13
 * <p/>
 * Copyright (c) 2016
 * Apache License
 * Version 2.0, January 2004
 * http://www.apache.org/licenses/
 */
package org.lego.util;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StringUtil {
    /**
     * 对象转化为json字符串
     */
    public static String object2Json(Object object) {
        try {
            return new ObjectMapper().writeValueAsString(object);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * json字符串转化为对象
     */
    public static <T> T json2Object(String json, Class<T> clazz) {
        try {
            return new ObjectMapper().readValue(json, clazz);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * json字符串转化为对象
     */
    public static <T> T json2Object(String json, TypeReference valueTypeRef) {
        try {
            return new ObjectMapper().readValue(json, valueTypeRef);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static String encode(String str) {
        return encode(str, "utf-8");
    }

    public static String decode(String str) {
        return decode(str, "utf-8");
    }

    /**
     * 对str进行编码，其中code为字符集
     *
     * @param str  待编码字符串
     * @param code 字符集
     * @return
     */
    public static String encode(String str, String code) {
        try {
            return URLEncoder.encode(str, code);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 对str进行解码，其中code为字符集
     *
     * @param str  待解码字符串
     * @param code 字符集
     * @return
     */
    public static String decode(String str, String code) {
        try {
            return URLDecoder.decode(str, code);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 验证是否是合法的手机号码
     * 移动：134、135、136、137、138、139、150、151、157(TD)、158、159、187、188
     * 联通：130、131、132、152、155、156、185、186
     * 电信：133、153、180、189、（1349卫通）
     *
     * @param telephone 手机号码
     * @return
     */
    public static boolean isTelephone(String telephone) {
        String regExp = "^((13[0-9])|(15[^4,\\d])|(18[0,5-9]))\\d{8}$";
        Matcher matcher = Pattern.compile(regExp).matcher(telephone);
        return matcher.find();
    }

    /**
     * 生成随机字符串
     */
    public static String getRandomStr(int length) {
        char[] chars = "abcde2345678gfynmnpwx".toCharArray();
        Random rand = new Random();
        StringBuilder text = new StringBuilder();
        for (int i = 0; i < length; ++i) {
            text.append(chars[rand.nextInt(chars.length)]);
        }
        return text.toString();
    }

    /**
     * 将秒数转为日期字符串
     *
     * @param seconds       秒数
     * @param dateFormatter 日期格式
     * @return 日期字符串
     */
    public static String convertSeconds2String(Integer seconds, String dateFormatter) {
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormatter);
        return sdf.format(new Date(seconds * 1000L));
    }

    /**
     * 获取去掉"-"的uuid
     */
    public static String getUUID() {
        return UUID.randomUUID().toString().replaceAll("-", "");
    }
}
